"""
教师个人信息路由模块

提供教师个人信息管理功能，包括：
1. 页面路由：
   - /teacher/profile: 教师个人信息页面
2. API路由：
   - GET /teacher/api/profile: 获取教师个人信息
   - POST /teacher/api/profile: 更新教师个人信息
   - PUT /teacher/api/profile/password: 更新教师密码

所有路由都需要教师登录权限，使用teacher_login_required装饰器进行保护。
部分路由使用add_registration装饰器自动添加注册信息。
部分路由使用handle_errors装饰器统一处理错误。
"""

from flask import Blueprint, render_template, request, jsonify, flash, redirect, url_for
from ..models.database import db
from ..models.models import Teacher, College, Registration
from .tea_auth import teacher_login_required, add_registration, current_user
from .tea_utils import get_common_data, handle_errors, teacher_required

# 创建蓝图，设置URL前缀为/teacher
bp = Blueprint('teacher_profile', __name__, url_prefix='/teacher')

# ==================== 页面路由 ====================
@bp.route('/profile')
@teacher_login_required
@add_registration
def profile(registration):
    """
    教师个人信息页面路由
    
    显示教师的个人信息和统计数据，包括：
    1. 基本信息（姓名、性别、联系方式等）
    2. 教学统计：
       - 班级数量
       - 课程数量
       - 学生数量
       - 成绩记录数量
    3. 所属学院信息
    
    Args:
        registration: 教师注册信息，由add_registration装饰器提供
        
    Returns:
        str: 渲染后的个人信息页面HTML，包含：
            - 教师基本信息
            - 教学统计数据
            - 学院信息
    """
    # 获取通用数据（包括教师信息和统计数据）
    common_data = get_common_data()
    
    # 初始化统计数据
    stats = {
        'classes': 0,    
        'courses': 0,    
        'students': 0,   
        'grades': 0      
    }
    
    # 如果存在统计数据，则更新
    if common_data['profile'] and common_data['profile']['total']:
        stats = common_data['profile']['total']
    
    return render_template('teacher/profile.html', 
                         registration=registration,
                         stats=stats,
                         **common_data)

# ==================== API路由 ====================
@bp.route('/api/profile', methods=['GET'])
@teacher_login_required
def get_profile():
    """
    获取教师个人信息的API
    
    返回当前登录教师的详细信息，包括：
    - 教师ID
    - 姓名
    - 性别
    - 联系方式
    - 所属学院
    - 其他基本信息
    
    Returns:
        dict: JSON响应，包含：
            - 教师信息字典（如果成功）
            - error: 错误信息（如果失败）
            
    Status Codes:
        200: 请求成功
        404: 教师不存在
    """
    teacher = Teacher.query.get(current_user.teacher_id)
    if not teacher:
        return jsonify({'error': '教师不存在'}), 404
    
    return jsonify(teacher.to_dict())

@bp.route('/api/profile', methods=['POST'])
@teacher_login_required
@handle_errors
def update_profile():
    """
    更新教师个人信息的API
    
    允许教师更新以下信息：
    - 姓名
    - 性别
    - 手机号码
    - 邮箱地址
    - 密码（可选）
    
    Request Body:
        {
            'name': str,      # 新的姓名
            'gender': str,    # 新的性别
            'phone': str,     # 新的手机号码
            'email': str,     # 新的邮箱地址
            'password': str   # 新的密码（可选）
        }
        
    Returns:
        dict: JSON响应，包含：
            - success: 请求是否成功
            - message: 成功或错误信息
            
    Status Codes:
        200: 更新成功
        400: 请求参数错误或更新失败
        404: 教师不存在
    """
    data = request.get_json()
    
    if not data:
        return jsonify({'error': '请求体为空'}), 400
    
    # 获取教师信息
    teacher = Teacher.query.get(current_user.teacher_id)
    if not teacher:
        return jsonify({'error': '教师不存在'}), 404
    
    try:
        # 更新教师基本信息
        if 'name' in data:
            teacher.name = data['name']
        if 'gender' in data:
            teacher.gender = data['gender']
        if 'phone' in data:
            teacher.phone = data['phone']
        if 'email' in data:
            teacher.email = data['email']
        
        # 更新注册信息
        registration = Registration.query.filter_by(
            user_type='teacher',
            user_id=str(current_user.teacher_id)
        ).first()
        
        if registration:
            if 'email' in data:
                registration.email = data['email']
            if 'phone' in data:
                registration.phone = data['phone']
            if 'password' in data and data['password']:
                registration.set_password(data['password'])
        
        db.session.commit()
        return jsonify({'success': True, 'message': '个人信息更新成功'})
    except Exception as e:
        db.session.rollback()
        return jsonify({'success': False, 'message': str(e)}), 400

@bp.route('/api/profile/password', methods=['PUT'])
@teacher_login_required
@handle_errors
def update_password():
    """
    更新教师密码的API
    
    允许教师修改登录密码，需要：
    1. 提供原密码
    2. 提供新密码
    
    Request Body:
        {
            'old_password': str,  # 原密码
            'new_password': str   # 新密码
        }
        
    Returns:
        dict: JSON响应，包含：
            - message: 成功信息（如果成功）
            - error: 错误信息（如果失败）
            
    Status Codes:
        200: 密码修改成功
        400: 请求参数错误或原密码错误
        404: 教师不存在
    """
    data = request.get_json()
    
    if not data:
        return jsonify({'error': '请求体为空'}), 400
    
    # 验证必要字段
    required_fields = ['old_password', 'new_password']
    for field in required_fields:
        if field not in data:
            return jsonify({'error': f'缺少必要字段: {field}'}), 400
    
    # 获取教师信息
    teacher = Teacher.query.get(current_user.teacher_id)
    if not teacher:
        return jsonify({'error': '教师不存在'}), 404
    
    # 验证原密码
    if not teacher.check_password(data['old_password']):
        return jsonify({'error': '原密码错误'}), 400
    
    try:
        # 更新密码
        teacher.set_password(data['new_password'])
        db.session.commit()
        return jsonify({'message': '密码修改成功'})
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': str(e)}), 400 